MySQL 書き込みの流れ
#MySQL
概要
MySQL x InnoDBにおける書き込みの流れをざっくり理解しておこう。
現状の自分が得たMySQLに関する知識を元に殴り書く。
イメージ図
https://scrapbox.io/files/6389eaf523a75b001d833469.png
書き込み(挿入・更新)までの流れ
1. SQL文を解析
2. オプティマイザで実行計画を立てる(統計情報を参考)
3. エグゼキュータで実行計画通りに実行
4. (InnoDB)トランザクション開始時ならUndo Logにスナップショット保存
5. (InnoDB)バッファプールのレコードがあるページに対して変更を加える
挿入の場合は、バッファプールに追加する
変更時も、レコードがバッファプールに存在しない場合は、ディスクから指定レコードが存在するページを読み込んでくる
6. (InnoDB)バッファプールへの書き込みと同じタイミングで、ログバッファにログ保存
7. (InnoDB)COMMITが来た時点で、ログバッファの内容をRedo Logにフラッシュする
もしバイナリログを有効化してるなら、この前にバイナリログに書き込みを完了させる
注意:設定によっては、COMMITがトリガーではなく、定期的に裏でフラッシュさせたりする
8. (InnoDB)バックグラウンドスレッドが定期的に、バッファプールのデータをフラッシュする
9. (InnoDB)二重書き込みバッファへの書き込みを越えて、テーブルスペースに書き込まれる